上一篇設計好資料表,並建立出來後,就能在裡面添加資料了。本文整理出資料的新增、查詢、更新與刪除語法,以及查詢條件的撰寫方式。
首先認識一下員工資料表的設計。
CREATE TABLE `employee` (
`emp_id` INT UNSIGNED AUTO_INCREMENT,
`name` NVARCHAR(50) NOT NULL,
`email` VARCHAR(50) NOT NULL UNIQUE,
`on_board_date` DATE NOT NULL DEFAULT("1970-01-01"),
`gender` CHAR(1) NOT NULL CHECK(`gender` IN ("M", "F")),
`salary` INT UNSIGNED NOT NULL CHECK(`salary` >= 27000),
`dept_id` INT UNSIGNED,
PRIMARY KEY(`emp_id`)
);
以下指令是新增一筆資料。
INSERT INTO `employee`(`name`, `email`, `on_board_date`, `gender`, `salary`, `dept_id`)
VALUE("Vincent", "vincent@yahoo.com.tw", "2018-01-01", "M", 32000, 1);
若要新增多筆資料,將 VALUE
改為 VALUES
,資料之間欄位值以逗點隔開即可。其實不論幾筆資料,統一用 VALUES
也是好選擇。
INSERT INTO `employee`(`name`, `email`, `on_board_date`, `gender`, `salary`, `dept_id`)
VALUES
("Ivy", "ivy@gmail.com", "2020-01-01", "F", 38000, 2),
("Roger", "roger@gmail.com", "2019-01-01", "M", 41000, null),
("Dora", "dora@gmail.com", "2021-01-01", "F", 38000, 2);
上面簡單新增了幾筆資料,而以下的指令是查詢出表中的所有資料。
SELECT * FROM `employee`;
以下是查看特定的欄位,將 *
改為 欄位名稱即可。
SELECT `name`, `salary` FROM `employee`;
以下是查詢欄位為特定值的資料,例如「emp_id」欄位為 1。加上條件時,會使用 WHERE
語法。
SELECT *
FROM `employee`
WHERE `emp_id` = 1;
假設目前資料表的現有資料節錄如下。
||emp_id||name||salary||dept_id||
|-|-|-|-|
|1|Vincent|32000|1|
|2|Ivy|38000|2|
|3|Roger|41000|null|
|4|Dora|38000|2|
以下是找出有薪水不到 40000 的員工的部門編號。若不希望查詢結果中,出現重複的資料,則需使用 DISTINCT
語法。
SELECT DISTINCT `dept_id`
FROM `employee`
WHERE `salary` < 40000;
透過 DISTINCT
,會讓原本內容為 1、2、2 共三筆的查詢結果,變成 1、2 兩筆,達到去除重複。
我們也可針對多個欄位,比方說想要知道每個部門中,是哪些薪水金額不到 40000。
SELECT DISTINCT `dept_id`, `salary`
FROM `employee`
WHERE `salary` < 40000;
只有當欄位值全部相同,才視為重複。以上的查詢結果有兩筆:「1 號部門 32000 元」、「2 號部門 38000 元」。
讀者首先要知道,在更新或刪除時,若未加上條件,代表要作用於表中的所有資料。MySQL 為了保護我們不要誤刪、誤改全部資料,其「安全模式」會禁止該操作。
執行以下指令,分別可關閉、開啟安全模式。
-- 關閉
SET SQL_SAFE_UPDATES = 0;
-- 開啟
SET SQL_SAFE_UPDATES = 1;
以下指令是將所有資料的「salary」欄位都增加 2000。
UPDATE `employee`
SET `salary` = `salary` + 2000;
以下指令是將薪資未達 30000 的員工,加至該金額,並設定為 0 號部門。
UPDATE `employee`
SET `salary` = 30000,
`dept_id` = 0
WHERE `salary` < 30000;
以下是刪除「emp_id」欄位為 4 的員工。
DELETE FROM `employee`
WHERE `emp_id` = 4;
比較運算子包含 >
、<
、=
、>=
、<=
與 !=
,相當直覺,筆者就不贅述。
以下條件是查詢薪資未達 40000 的員工。
SELECT *
FROM `employee`
WHERE `salary` < 40000;
以下條件是查詢 2019 年起入職的員工。雖然欄位是是日期型態,但只要以「YYYY-MM-DD」的格式撰寫字串即可。
SELECT *
FROM `employee`
WHERE `on_board_date` >= "2019-01-01";
以下條件是查詢女性員工。
SELECT *
FROM `employee`
WHERE `gender` = "F";
邏輯運算子包含 AND
、OR
與 NOT
,也很直覺。
以下條件是查詢 2020 年以前入職,而薪資未達 40000 的員工。
SELECT *
FROM `employee`
WHERE `on_board_date` < "2020-01-01" AND `salary` < 40000;
若要以數值或日期的範圍作為條件,可用 BETWEEN ... AND ...
語法。以下條件是查詢未在 2018 到 2019 年入職的員工。
SELECT *
FROM `employee`
WHERE NOT (`on_board_date` BETWEEN "2018-01-01" AND "2019-12-31");
當包含的條件太多,為了避免混亂,可用括弧包起來。
這種條件是以欄位值是否符合特定格式,來進行查詢。
會使用兩個萬用字元。%
代表 0 到多個字;_
代表 1 個字。
以下條件是查詢使用 Yahoo 信箱的員工。
SELECT *
FROM `employee`
WHERE `email` LIKE "_%@yahoo.com%";
其中 _%
組合出 1 到多個字的效果。
如果查詢條件是多個指定的值,雖然用 OR
運算子串接起來也行,但不易閱讀。可改用 IN
語法。
以下條件是查詢 1、2 號部門的員工。
SELECT *
FROM `employee`
WHERE `dept_id` IN (1, 2);
當欄位沒有值,也就是 null,則那些資料並不會參與需要用到該欄位的查詢。
以下條件是查詢沒有部門編號的員工。
SELECT *
FROM `employee`
WHERE `dept_id` IS NULL;
今日文章到此結束!
最後宣傳一下自己的部落格,我是「新手工程師的程式教室」的作者,主要發表後端相關文章,請多指教